﻿/**
 * \file VueUnite.cs
 * \brief Classe VueUnite
 * \author ARTUR Vincent
 * \author LAPERDRIX Pierre
 * \version 1.0
 */

namespace WpfJeu
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Implem;
    using System.Windows.Controls;
    using System.Windows.Media.Imaging;
    using System.Windows.Input;
    using System.Windows;
    using System.Windows.Shapes;
    using System.Windows.Media;
    using Interfaces;

    /**
     * \class VueUnite
     * \brief Vue des unités du plateau de jeu
     */
    public class VueUnite : UserControl
    {
        /*!< Unite du modèle associée à la vue*/
        private Unite _unite;
        /*!< Propriete accedant a l'attribut _unite */
        public Unite Unite
        {
            get { return _unite; }
            set { _unite = value; }
        }

        /*!< Position de la vue sur la grille de jeu*/
        private Position _pos;
        /*!< Propriete accedant a l'attribut _pos */
        public Position Pos
        {
            get { return _pos; }
            set { _pos = value; }
        }

        /*!< Booléen permettant de savoir si l'unité appartient au joueur en train de jouer*/
        private bool _appartientJoueurCourant;
        /*!< Propriete accedant a l'attribut _appartientJoueurCourant */
        public bool AppartientJoueurCourant
        {
            get { return _appartientJoueurCourant; }
            set { _appartientJoueurCourant = value; }
        }

        /*!< Routed Event pour que le clic sur une unite soit gere par le MainWindow */
        public static readonly RoutedEvent ClickUniteEvent = EventManager.RegisterRoutedEvent(
            "ClickUnite", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(VueUnite));

        /*!< Propriete ajoutant/supprimant l'event ClickUniteEvent */
        public event RoutedEventHandler ClickUnite
        {
            add { AddHandler(ClickUniteEvent, value); }
            remove { RemoveHandler(ClickUniteEvent, value); }
        }


        /**
         * \fn public VueUnite(Unite u)
         * \brief Constructeur de VueUnite
         * \param u l'unité liée à cette vue
         */
        public VueUnite(Unite u)
        {
            //Ajout de l'unite a la vue
            Unite = u;
            Pos = u.Posit;
            AppartientJoueurCourant = false;
        }

        public void moveUp()
        {
            int x = Unite.Posit.X;
            int y = Unite.Posit.Y;
            if (Unite.MovRest > 0 && x-1 > 0)
            {
                Unite.seDeplacer(new Position(x-1, y ));
                if (Unite != null && (Unite.Posit.X != x || Unite.Posit.Y != y))
                {
                    Pos = Unite.Posit;

                    //Deplacement de l'element d'une case v1 a une case v2
                    VueCase v1 = MainWindow.all[new Position(x,y)];
                    VueCase v2 = MainWindow.all[new Position(x-1, y)];

                    v1.departUnite(this);
                    v2.nouvelleUnite(this);
                }
            }
        }

        public void moveDown()
        {
            int x = Unite.Posit.X;
            int y = Unite.Posit.Y;
            if (Unite.MovRest > 0 && x +1 > 0)
            {
                Unite.seDeplacer(new Position(x +1, y));
                if (Unite != null && (Unite.Posit.X != x || Unite.Posit.Y != y))
                {
                    Pos = Unite.Posit;

                    //Deplacement de l'element d'une case v1 a une case v2
                    VueCase v1 = MainWindow.all[new Position(x, y)];
                    VueCase v2 = MainWindow.all[new Position(x +1, y)];

                    v1.departUnite(this);
                    v2.nouvelleUnite(this);
                }
            }
        }

        public void moveLeft()
        {
            int x = Unite.Posit.X;
            int y = Unite.Posit.Y;
            if (Unite.MovRest > 0 && y-1 > 0)
            {
                Unite.seDeplacer(new Position(x, y-1));
                if (Unite != null && (Unite.Posit.X != x || Unite.Posit.Y != y))
                {
                    Pos = Unite.Posit;

                    //Deplacement de l'element d'une case v1 a une case v2
                    VueCase v1 = MainWindow.all[new Position(x, y)];
                    VueCase v2 = MainWindow.all[new Position(x, y-1)];

                    v1.departUnite(this);
                    v2.nouvelleUnite(this);
                }
            }
        }

        public void moveRight()
        {
            int x = Unite.Posit.X;
            int y = Unite.Posit.Y;
            if (Unite.MovRest > 0 && y +1 > 0)
            {
                Unite.seDeplacer(new Position(x, y + 1));
                if (Unite != null && (Unite.Posit.X != x || Unite.Posit.Y != y))
                {
                    Pos = Unite.Posit;

                    //Deplacement de l'element d'une case v1 a une case v2
                    VueCase v1 = MainWindow.all[new Position(x, y)];
                    VueCase v2 = MainWindow.all[new Position(x, y + 1)];

                    v1.departUnite(this);
                    v2.nouvelleUnite(this);
                }
            }
        }


        /**
         * \fn public override string ToString()
         * \brief Méthode ToString() de la vue
         * \return la chaîne associée à la vue
         */
        public override string ToString()
        {
           string type;
           if (Unite is IEnseignant)
           {
               type = "Enseignant";
           }
           else if (Unite is IEtudiant)
           {
               type = "Etudiant";
           }
           else
           {
               type = "Directeur";
           }
           if (Unite.JoueurProprietaire != Partie.joueurCourant)
           {
               type += " ennemi";
           }
           return type + "\nPV : " + Unite.Vie + " - Mouvement : " + Unite.MovRest;
        }
    }
}
